﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModel.h"
#include "UniIdentity.h"

/// \brief 声明单位GUID
/// \param UNIT_NAME 单位枚举变量名
#define DECLARE_UNIT_GUID(UNIT_NAME) const Guid c_guid_##UNIT_NAME

/// \brief 获取单位定义数据
///
/// \param UNIT_NAME   单位名称
/// \return 单位定义数据
#define UNIT(UNIT_NAME) \
    GetUnitUid_##UNIT_NAME()


/// \brief 实现获取单位定义数据的方法
/// \param UNIT_NAME 内建参数枚举变量名
/// \param DEBUGINFO 单位调试信息
/// \param LENGTH_EXPONENT 长度指数
/// \param ANGLE_EXPONENT 角度指数
/// \param MASS_EXPONENT 质量指数
/// \param TIME_EXPONENT 时间指数
/// \param ELECTRIC_CURRENT_EXPONENT 电流指数
/// \param TEMPERATURE_EXPONENT 温度指数
/// \param LUMINOUS_INTENSITY_EXPONENT 亮度指数
#define IMPLEMENT_UNIT(UNIT_NAME, DEBUGINFO, LENGTH_EXPONENT, ANGLE_EXPONENT, MASS_EXPONENT, TIME_EXPONENT, ELECTRIC_CURRENT_EXPONENT, TEMPERATURE_EXPONENT, LUMINOUS_INTENSITY_EXPONENT) \
    const gcmp::UniIdentity& GetUnitUid_##UNIT_NAME() \
    { \
        static gcmp::UniIdentity c_uid_##UNIT_NAME(c_guid_##UNIT_NAME, DEBUGINFO); \
        return c_uid_##UNIT_NAME; \
    } \
    static UnitInitializer initializer_##UNIT_NAME(GetUnitUid_##UNIT_NAME(), LENGTH_EXPONENT, ANGLE_EXPONENT, MASS_EXPONENT, TIME_EXPONENT, ELECTRIC_CURRENT_EXPONENT, TEMPERATURE_EXPONENT, LUMINOUS_INTENSITY_EXPONENT);  \

namespace gcmp
{
    /// \brief 内建参数初始化器，用于将定义的内建参数注册到IBuiltInParameterDefinitionManager中
    class GCMP_MODEL_EXPORT UnitInitializer
    {
    public:
        UnitInitializer(const gcmp::UniIdentity& unitTypeId,
            int lengthExponent, int angleExponent, int massExponent, int timeExponent, int electricCurrentExponent,
            int temperatureExponent, int luminousIntensityExponent);
    };
}


/// \brief 声明获取单位定义数据的方法
#define DEFINE_UNIT(UNIT_NAME) \
    GCMP_MODEL_EXPORT const gcmp::UniIdentity& GetUnitUid_##UNIT_NAME();

DEFINE_UNIT(None);                // 无单位
DEFINE_UNIT(Custom);              // 自定义
DEFINE_UNIT(Number);              // 个数
DEFINE_UNIT(Length);              // 长度
DEFINE_UNIT(Angle);               // 角度
DEFINE_UNIT(Mass);                // 质量
DEFINE_UNIT(Time);                // 时间
DEFINE_UNIT(ElectricCurrent);     // 电流
DEFINE_UNIT(Temperature);         // 温度
DEFINE_UNIT(LuminousIntensity);   // 亮度
DEFINE_UNIT(Area);                // 面积
DEFINE_UNIT(Volume);              // 体积
DEFINE_UNIT(Density);             // 密度

#undef DEFINE_UNIT